package com.fc.primary.queue;


import java.util.concurrent.ArrayBlockingQueue;

/**
 * @program: fc-java->MyQueue
 * @description: 手写队列
 * @author: G_Y
 * @create: 2019-09-01 12:27
 * 队列————抽象意义上的数据结构，非实际性的物理数据结构
 **/
public class MyQueue<T> {
    /*
     * 队列特性：先进先出————排队，队尾插入(新增)、队头出(删除)
     * 就像排队去面试，先进去的人，先出来
     * 手写队列，实则可以利用各种数据结构
     */
    /**
     * 用数组来实现队列
     * 循环数组
     */
    final Object[] items;

    /**
     * 出队指针
     */
    int takeIndex;

    /**
     * 入队指针
     */
    int putIndex;

    /**
     * 队列实际存储的元素量
     */
    int count;

    /**
     * @param capacity 构造方法
     */
    public MyQueue(int capacity) {
        items = new Object[capacity];
    }

    /**
     * 入队列
     *
     * @return
     */
    public boolean enqueue(T item) {
        if (count == items.length) {
            throw new RuntimeException("满啦");
        }
        items[putIndex] = item;
        this.updatePutIndex();
        count++;
        System.out.println("入队元素" + item);
        return true;
    }

    /**
     * 出队列
     *
     * @return
     */
    public T dequeue() {
        if (count < 1) {
            throw new RuntimeException("空啦");
        }
        T item = (T) items[takeIndex];
        items[takeIndex] = null;
        updateTakeIndex();
        count--;
        return item;
    }

    private void updatePutIndex() {
        if (putIndex == items.length - 1) {
            putIndex = 0;
            return;
        }
        putIndex++;
    }

    private void updateTakeIndex() {
        if (takeIndex == items.length - 1) {
            takeIndex = 0;
            return;
        }
        takeIndex++;
    }

    /**
     * 队列存储的元素量
     *
     * @return
     */
    public int size() {
        return count;
    }

    /**
     * 获取队列容量
     *
     * @return
     */
    public int getCap() {
        return items.length;
    }

}
